package com.example.it.looker.utils;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;

import com.example.it.looker.R;

import java.util.HashMap;
import java.util.Map;


/**
 * Fragment的帮助类，用于生产Fragment
 */
public class FragmentUtil {
    /**
     * 创建Fragment使用的回调函数
     */
    public interface CreateFragmentCallBack {
        /**
         * 创建碎片使用的构造函数
         *
         * @param position BottonNavigationBar的Id
         * @return 根据索引创建的碎片
         */
        Fragment CreateFragment(int position);
    }

    //当前选中的fragment的索引
    private static int currentPosition = -1;
    //所有的Fragment
    private static Map<Integer, Fragment> fragmentMap = new HashMap<Integer, Fragment>();

    /**
     * 创建碎片，根据指定的索引，如果存在缓存那么使用缓存否则重新创建并缓存
     *
     * @param transaction            碎片的事务
     * @param position               碎片的索引
     * @param createFragmentCallBack 创建碎片的回调函数  FragmentUtil.CreateFragmentCallBack
     */
    public static void showFragmetn(FragmentTransaction transaction, int position, CreateFragmentCallBack createFragmentCallBack) {
        //判断是否重复选中Fragment
        if (position == currentPosition)
            return;

        Fragment currentFragment = null;

        //如果Map中存在指定的Key那么寻找指定的Key
        if (fragmentMap.containsKey(position)) {
            //从保存Fragment的集合中拿到Framgnet
            currentFragment = fragmentMap.get(position);
            if (currentFragment == null) {
                currentFragment = createFragmentCallBack.CreateFragment(position);
            }
        } else {
            currentFragment = createFragmentCallBack.CreateFragment(position);
            fragmentMap.put(position, currentFragment);
        }
        //显示碎片
        hideAllFragment(transaction);
        transaction.add(R.id.flFragmentParent, currentFragment);
        transaction.show(currentFragment);
    }

    /**
     * 隐藏所有的Fragment
     *
     * @param transaction Fragment的事务
     */
    private static void hideAllFragment(FragmentTransaction transaction) {
        for (Map.Entry<Integer, Fragment> item : fragmentMap.entrySet()) {
            if (item.getValue() != null) {
                transaction.hide(item.getValue());
            }
        }
        transaction.commit();
    }
}
